package control

import (
	"dicomtodb/models"
	"os"
	"path/filepath"
	"strings"
	"time"
)

var WFileInfoChan = make(chan *models.FileInfo, 50)
var successMsg = make(chan int64)

//处理目录主程序
func ProceFileToDB() {
	defer models.Wait.Done()
	models.Log.DEBUG("FileInfoWriteToDB start......")
	//统计信息
	models.Wait.Add(1)
	go FileToDbProgress()

	//开启协程等待，文件信息写入数据库
	models.Wait.Add(1)
	go FileNameWriteToDB()

	//遍历目录写入管道
	models.Wait.Add(1)
	go TraversePath(models.Config.DicomFilePath)
}

//文件信息写入数据库
func FileNameWriteToDB() {
	defer models.Wait.Done()
	defer models.Log.DEBUG("FileNameWriteToDB is quit")
loop:
	for {
		select {
		case wf, ok := <-WFileInfoChan:
			if !ok {
				models.Log.DEBUG("写入文件名管道读取结束～！")
				n := models.CountFileFromDB()
				successMsg <- n
				close(successMsg)
				models.DicomFileCount = n
				break loop
			}
			wf.InsertOne()
		default:
			time.Sleep(500 * time.Microsecond)
		}
	}
	models.Log.INFO("文件名管道写入数据库完成～！")

}

//遍历文件夹，统计文件个数
func TraversePath(dir string) error {
	defer models.Wait.Done()
	_, err := os.Stat(dir)
	if err != nil {
		models.Log.FATAL("未找到%v文件夹，请确认配置文件是否正确", dir)
		panic("dicom文件目录不存在，请检查配置文件中设置项")
	}
	//fix 读取文件夹 就写入数据中，避免一次读取太多，卡死
	err = filepath.Walk(dir, Listfunc)
	if err != nil {
		models.Log.FATAL("解析文件异常")
		return err
	}
	close(WFileInfoChan)
	models.Log.DEBUG("文件夹解读完成～！！")
	return nil
}

//文件夹遍历 写入管道
func Listfunc(path string, f os.FileInfo, err error) error {
	var strRet string
	// strRet, _ = os.Getwd()
	// // strRet = "."
	// ostype := runtime.GOOS
	// if ostype == "windows" {
	// 	strRet += "\\"
	// } else if ostype == "linux" || ostype == "darwin" {
	// 	strRet += "/"
	// }

	if f == nil {
		return err
	}
	if f.IsDir() {
		return nil
	}
	strRet += path //+ "\r\n"
	//用strings.HasSuffix(src, suffix)//判断src中是否包含 suffix结尾
	ok := strings.HasSuffix(strRet, ".dcm")
	if ok {
		// ListDicomFile = append(ListDicomFile, strRet) //将目录push到listfile []string中
		f := models.NewFileInfo(strRet)
		WFileInfoChan <- f
		models.Log.DEBUG("文件信息%v写入管道完成~!", strRet)
	}
	return nil
}
